package DysList

import "IteratorPattern/Iterator"

// DysListNode DysListNode[T any]
// @Description: 自定义链表节点
type DysListNode[T any] struct {
	Value T
	Next  *DysListNode[T]
}

type DysList[T any] struct {
	Root *DysListNode[T]
}

func (d *DysList[T]) Size() int {
	var count int = 0
	var p = d.Root
	for p != nil {
		count++
		p = p.Next
	}
	return count
}

func (d *DysList[T]) Add(t T) {
	if d.Root == nil {
		d.Root = &DysListNode[T]{Value: t, Next: nil}
	} else {
		var p = d.Root
		for p.Next != nil {
			p = p.Next
		}
		p.Next = &DysListNode[T]{Value: t, Next: nil}
	}
}

// ListIterator [T any]
// @Description: 列表迭代器
type ListIterator[T any] struct {
	RootNode    *DysListNode[T]
	CurrentNode *DysListNode[T]
}

// HasNext
//
//	@Description:判断是否具有下一个节点
//	@receiver d
//	@return bool
func (d *ListIterator[T]) HasNext() bool {
	return d.CurrentNode != nil
}

// Next
//
//	@Description:获取下一个节点的值
//	@receiver d
//	@return T
func (d *ListIterator[T]) Next() *T {
	var val = &d.CurrentNode.Value
	if d.HasNext() {
		d.CurrentNode = d.CurrentNode.Next
	}
	return val
}

// GetIterator
//
//	@Description: 获取列表迭代器
//	@receiver d
//	@return Iterator[T]
func (d *DysList[T]) GetIterator() Iterator.Iterator[T] {
	return &ListIterator[T]{RootNode: d.Root, CurrentNode: d.Root}
}
